﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QPushButton>
#include <QLabel>
#include <QWidget>
#include <QKeyEvent>
#include <fstream>
#include <iostream>
#include <string>
#include <thread>
#include "view.h"
#include "Game.h"
#include "Ai.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE


//Summary: ai状态的标志，0表示结束ai的状态，1表示开启ai的状态
static bool flagAi;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    //Summary: 构造函数用于初始化，先调用函数readOptimalScore，然后调用View类函数layout显示数字和最高分，游戏开始
    MainWindow(QWidget *parent = nullptr);

    //Summary: 析构函数
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    //Summary: 实例化Game
    Game game;

    //Summary: 实例化View
    View view;

    //Summary: 实例化Ai
    Ai ai;

    /*
     * Function: readOptimalScore
     * Summary: 若存在最佳分数的文件，则读取该文件中的分数，若不存在则取初值0；然后调用Game类函数setOptimalScore设置最佳分数
     * Input: void
     * Output: void
     */
    void readOptimalScore();

    /*
     * Function: writeOptimalScore
     * Summary: 将最佳分数写入文件
     * Input: void
     * Output: void
     */
    void writeOptimalScore();

    /*
     * Function: keyPressEvent
     * Summary: 根据按键赋值directionID，调用Game类函数move(directionID)实现一次移动并返回是否移动成功，若是{
     *              则调用View类函数renew
     *              判断当前分数是否大于最佳分数，若是则{调用Game类函数setOptimalScore设置最佳分数为当前分数，然后调用View类函数displayOptimalScore}
     *              if调用Game类函数passGame判断是否游戏通关，若是{
     *                  则先判断当前分数是否等于最佳分数，若是{则调用函数writeOptimalScore}
     *                  然后调用View类函数display
     *              }
     *              elseif调用Game类函数gameOver判断是否游戏结束，若是{
     *                  则先判断当前分数是否等于最佳分数，若是{则调用函数writeOptimalScore}
     *                  然后调用View类函数display
     *              }
     *              else{调用View类函数display}
     *          }
     * Input: QKeyEvent *event
     * Output: void
     */
    void keyPressEvent(QKeyEvent *event);

    //Summary: ai线程函数，为了不占用按钮的触发事件
    void threadAi();

private slots:
    /*
     * Function: restart
     * Summary: 点击restart按键，则先判断当前分数是否等于最佳分数，若是{则调用函数writeOptimalScore}
     *          然后调用Game类函数restart，最后调用View类函数displayNumber、displayCurrentScore，游戏重新开始
     * Input: void
     * Output: void
     */
    void restart();

    /*
     * Function: tip
     * Summary: 点击tip按键，根据ai算法算出方向，调用View类函数renewTip
     * Input: void
     * Output: void
     */
    void tip();

    /*
     * Function: aiButton
     * Summary: 点击开始托管，再次点击结束托管
     * Input: void
     * Output: void
     */
    void aiButton();

};
#endif // MAINWINDOW_H
